/*
 * othelloTranspositionNode.h
 *
 *  Created on: 21/06/2011
 *      Author: frandres
 */

#ifndef OTHELLOTRANSPOSITIONNODE_H_
#define OTHELLOTRANSPOSITIONNODE_H_
#include "otello_cut.h"
#pragma pack(push,1)
#define NOT_SPECIFIED 254
/*
 * Esta clase contiene un nodo Othello así como la información necesaria
 * para llenar una tabla de transposicion: un upper y un lower bound.
 *
 * Se asume que el rango del valor del juego está entre 0 y NOT_SPECIFIED-1. (En general, basta
 * que esté entre 0 y 72). El valor NOT_SPECIFIED está reservado para especificar
 * que NO hay un lower o un upperbound especificado.
 */
class OthelloTranspositionTableNode {
public:
	OthelloTranspositionTableNode(state_t node, int lowerBound =NOT_SPECIFIED, int upperBound =NOT_SPECIFIED);
	~OthelloTranspositionTableNode();
    inline int getLowerBound() const
    {
        return (int)(lowerBound);
    }

    inline int getUpperBound() const
    {
        return (int)(upperBound);
    }

    bool isTerminal(){
    	return node.terminal();
    }

    bool isUpperSet(){
    	return getUpperBound() <NOT_SPECIFIED;
    }

    bool isLowerSet(){
    	return getLowerBound() <NOT_SPECIFIED;
    }

    void setLowerBound(int lowerBound);
    void setUpperBound(int upperBound);

    /* Devuelve si es válido que el jugador especificado
     * por isBlack juegue en la pos dada, con el tablero especificado.
     *
     * Si es válido, devuelve un nuevo OthelloTranspositionTableNode en son.
     */
    bool generateSon(bool isBlack, int pos, OthelloTranspositionTableNode * &son);

    // Devuelve el valor del nodo.
    inline int evaluate(){
    	return node.value();
    }

    // Devuelve true si los t_state iguales.
    inline bool compare (OthelloTranspositionTableNode * b){

		return (this->node.t() == b->node.t() &&
				this->node.pos() == b->node.pos() &&
				this->node.free() == b->node.free());
    }

    // Devuelve la clave para la función de hash.
    inline long getKey(){
    	return long (node.free() ^ node.pos());
    }

    void cloneNode(OthelloTranspositionTableNode * & clone);

//private:
	state_t node;
	unsigned char lowerBound;
	unsigned char upperBound;
};

#endif /* OTHELLOTRANSPOSITIONNODE_H_ */
